package com.jxin.mall.config.parent;

import cn.hutool.core.util.StrUtil;
import com.jxin.mall.entity.consts.HttpRspStatusEnum;
import com.jxin.mall.entity.entity.GlobalRsp;
import org.apache.commons.collections4.MapUtils;
import org.zalando.problem.Problem;
import org.zalando.problem.ProblemBuilder;

import java.util.Map;

/**
 * 服务层基础类
 * @author 蔡佳新
 * @version 1.0
 * @since jdk 1.8
 */
public class BaseService {
    /**
     * 创建成功的响应实例,并带上数据实例
     * @param  data 数据实例
     * @return 响应实例
     * @author 蔡佳新
     */
    protected <T> GlobalRsp<T> createSuccessWithData(T data) {
        return new GlobalRsp<>(HttpRspStatusEnum.HTTP_RES_CODE_200.getCode(),
                               HttpRspStatusEnum.HTTP_RES_CODE_200.getName(),
                               data);

    }
    /**
     * 创建成功的响应实例
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createSuccess() {
        return GlobalRsp.builder()
                        .code(HttpRspStatusEnum.HTTP_RES_CODE_200.getCode())
                        .msg(HttpRspStatusEnum.HTTP_RES_CODE_200.getName())
                        .build();

    }
    /**
     * 创建失败的响应实例,并带上数据实例
     * @param  data 数据实例
     * @return 响应实例
     * @author 蔡佳新
     */
    protected <T> GlobalRsp<T> createFaildWithData(T data) {
        return new GlobalRsp<>(HttpRspStatusEnum.HTTP_RES_CODE_500.getCode(),
                               HttpRspStatusEnum.HTTP_RES_CODE_500.getName(),
                               data);
    }
    /**
     * 创建失败的响应实例
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createFaild() {
        return GlobalRsp.builder()
                        .code(HttpRspStatusEnum.HTTP_RES_CODE_500.getCode())
                        .msg(HttpRspStatusEnum.HTTP_RES_CODE_500.getName())
                        .build();
    }
    /**
     * 创建失败的响应实例,并指定消息文本
     * @param  msg 消息
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createFaildWithMsg(String msg) {
        return GlobalRsp.builder()
                        .code(HttpRspStatusEnum.HTTP_RES_CODE_500.getCode())
                        .msg(msg)
                        .build();
    }

    /**
     * 创建自定义的返回实例
     * @param  code 状态code
     * @param  msg  消息
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createCustom(Integer code, String msg) {
        return GlobalRsp.builder()
                        .code(code)
                        .msg(msg)
                        .build();
    }
    /**
     * 创建自定义的返回实例
     * @param  code 状态code
     * @param  msg  消息
     * @param  data 数据
     * @param  <T>  数据类型
     * @return 响应实例
     * @author 蔡佳新
     */
    protected <T> GlobalRsp<T> createCustomWithData(Integer code, String msg, T data) {
        return new GlobalRsp<>(code, msg, data);
    }

    /**
     * 创建自定义结构的返回实例
     * @param map 状态code
     * @return 响应实例
     * @author 蔡佳新
     */
    protected Problem createCustomRsp(Map<String, Object> map) {
        if(MapUtils.isEmpty(map)){
            return Problem.builder().build();
        }
        final ProblemBuilder builder = Problem.builder();
        map.forEach(builder::with);
        return builder.build();
    }
    /**
     * 创建入参异常返回实例
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createReqParamErr() {
        return GlobalRsp.builder()
                        .code(HttpRspStatusEnum.HTTP_RES_CODE_501.getCode())
                        .msg(HttpRspStatusEnum.HTTP_RES_CODE_501.getName())
                        .build();
    }
    /**
     * 创建入参异常返回实例, 带补充信息
     * @param  msg 消息
     * @return 响应实例
     * @author 蔡佳新
     */
    protected GlobalRsp createReqParamErrWithMsg(String msg) {
        return GlobalRsp.builder()
                .code(HttpRspStatusEnum.HTTP_RES_CODE_501.getCode())
                .msg(StrUtil.builder(HttpRspStatusEnum.HTTP_RES_CODE_501.getName(),
                                     StrUtil.COLON,
                                     msg).toString())
                .build();
    }

    /**
     * 校验响应是否成功
     * @param  globalRsp 响应参数
     * @return 如果响应参数code不为500则为 <code>true</code>
     */
    protected Boolean isSuccess(GlobalRsp globalRsp){
        if(HttpRspStatusEnum.HTTP_RES_CODE_500.getCode().equals(globalRsp.getCode())){
            return false;
        }
        return true;
    }
}
